///////////////////////////////////////////////////////////////
//  Copyright Christopher Kormanyos 2002 - 2011.
//  Copyright 2011 John Maddock. Distributed under the Boost
//  Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
//
// This work is based on an earlier work:
// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469

#ifdef _MSC_VER
#define _SCL_SECURE_NO_WARNINGS
#endif

#include <boost/detail/lightweight_test.hpp>
#include <boost/array.hpp>
#include "test.hpp"

#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) &&             \
    !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && \
    !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)
#define TEST_MPF_50
//#  define TEST_MPF
#define TEST_BACKEND
#define TEST_CPP_DEC_FLOAT
#define TEST_MPFR_50
#define TEST_MPFI_50
#define TEST_CPP_BIN_FLOAT

#ifdef _MSC_VER
#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
#endif
#ifdef __GNUC__
#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
#endif

#endif

#if defined(TEST_MPF_50)
#include <nil/crypto3/multiprecision/gmp.hpp>
#endif
#ifdef TEST_MPFR_50
#include <nil/crypto3/multiprecision/mpfr.hpp>
#endif
#ifdef TEST_MPFI_50
#include <nil/crypto3/multiprecision/mpfi.hpp>
#endif
#ifdef TEST_BACKEND
#include <nil/crypto3/multiprecision/concepts/mp_number_archetypes.hpp>
#endif
#ifdef TEST_CPP_DEC_FLOAT
#include <nil/crypto3/multiprecision/cpp_dec_float.hpp>
#endif
#ifdef TEST_FLOAT128
#include <nil/crypto3/multiprecision/float128.hpp>
#endif
#ifdef TEST_CPP_BIN_FLOAT
#include <nil/crypto3/multiprecision/cpp_bin_float.hpp>
#endif

template<class T>
void test() {
    std::cout << "Testing type " << typeid(T).name() << std::endl;
    static const boost::array<const char*, 101> data = {{
        "-2."
        "30258509299404568401799145468436420760110148862877297603332790096757260967735248023599720508959829834196778404"
        "22862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461"
        "63366222287698219886746543667474404243274365155048934314939391479619404400222105101714174800368808401264708068"
        "5567743216228355220114804663715659121373450747856947683463616792101806",
        "10."
        "35507344091937869969047747203647046931579490537265046111952055740596625019155494838884779430692370612837315278"
        "02349886384439548213279535430320752288823068939015400381565032654169509325492081747136408406700023215345983566"
        "31953006304821201484830902632165858733357596733427094375150860310219829690440417223992885533566388118595248523"
        "193740778052893647271700612136670114224280374211626787106078693643289",
        "11."
        "74136541471987235999563059347583495785213063903252834891083962157675237820758276684083262690144633785906432132"
        "84540960886568179871124091762814426081849508883272750703562906498856180533672451690053795453573456452350947760"
        "18156840041023694466493107510640907700621694994008944652785168884717808235919056023540605910031676977750466679"
        "901495978099025342154131430098841939052890393197699093697421676686108",
        "12."
        "55229518883939106440307898305850131378696104241905150934698847472661564371068819205315847171769599190485394183"
        "73872563400733100643412820228302484521379462739865427131549377596976876560734853111020536665026330064294466327"
        "94099471395918827441203897096147814416727830805903830888831170139661499031930347916453836121200110772307492771"
        "615813954882033814741470466415076136175748560866462690250372712624427",
        "13."
        "12765917900902322346243585913156826327069465639834188399662474212182724479008698347907678965083909936781641397"
        "38548349536226825636076344431721358605949046778165351800871731390161480056699224814471637432242998775072386782"
        "11143589794045918796481043886370356097543992832740147675455938865809411656649573849752219496450552557818749443"
        "74229417864853289321901220692566918330756199433299461690335766708584",
        "13."
        "57394621001773002723917709729705865145567014812733321505549598656596498803716638961850352356157099416526859904"
        "53757535124005652000597907032807602522137147572122135258335567274626477295662583014901154148647484362907941911"
        "11843775262434063842232241185107471214859854864335150887423144285468856056851239653315249148749701603523173627"
        "966758652109489308872414194066451074827802642589890222384815709071028",
        "13."
        "93858928470110183167503790383244489484669040742062861048116393738053646530580531618176858660460334119703365557"
        "63710823041462199916932539870434522413072244787180138724592878132642830019066229596818723215760871439759720336"
        "51747378310838673897181549722528073649569290162541997276292708638316653324605571398691171391912961431088832002"
        "969546541039753774950645926800096854799942237644831671997679785482847",
        "14."
        "24689062089740867244545156609817852476342993551061021669035522969507877843070880442187063965537074454937027342"
        "61242952405274017083611009238717085897226519604288639558355586346404268463831611180623105021760545464686005165"
        "88908689567134867002953229862887953032595529925511011383644740837050282379317993152702704798000312156694502691"
        "021267028423979454580574052732764336948692001989411724963233511159783",
        "14."
        "51395339092117324610526432755496036199337959182144260442491096061930765841595850793460014941610881052330595683"
        "87301697322474440378149877206197144392627731286524335017452267722713495793504760542994142411447659897099722350"
        "54797654268888866862754951806530258172012144782494153835379469158402935499279352670104811895501876820538928072"
        "64533011114305883442850485847010726074555176479027986850883182954118",
        "14."
        "74951945179553771646264367288854937066605763912821204400186859006281333547248370812005695518722071348693118022"
        "11861917418607188233473991292804911764996089988579494073512474325138250951619423722892036572312563449099974807"
        "32110798704027258108845584594081552703009126596026870753341888414903979390651641367952487019992866762344920748"
        "102417282166652161104367292712971759633790964534907923779335451109079",
        "14."
        "96024047564466239002453577205836049597268999569226461911805062098486339733588314774100117513783708885619620766"
        "00640618396850861204443248854201723843577802250678634325464539234343263588343740217007091537916330348005546300"
        "92122384413882780201869241166113270104158152592921242256738530713688528178980864650875690860545577283508963373"
        "084295388766350046816560200649161822618828666606722223620871032632611",
        "15."
        "15086082972892581627026996409267343354284121096483016279322577053555151884093331519040626227309857379523806352"
        "39554853908960016708396359763770710481403636878085793874951867374926395435195347748516351011695796147126079354"
        "94886581440494071142193798729857001548284675533558490478467589884332536443679208006567281631805562767928329937"
        "083844501800478013385969649342207304490375728237042482944784544838254",
        "15."
        "32488357950643649357023359744888351969335181437454939749848903514822188227004243665409930681131326134682394167"
        "28884473136289312569277739469857278148864205700565521187834681275436767696333441362095006366668300260980801951"
        "80498059221494203817961212365532443050015541947762494604799890429565189588245725920948145579035449699519788465"
        "993549043152027361890729572024195346130030456992216388648768722394836",
        "15."
        "48496899158356071286216415260253297250559688286540249806564425073730195512559600651527446161920430255828573332"
        "02999577991859954412090094514088083765608729242067101175857185787275917085539572977292034574431015224352653122"
        "91388453827953066056871634785359329503731609907767433693085428240202927311226115616775436485821324503901092891"
        "486358733365244513748729928672060637178808283856096451123227237766837",
        "15."
        "63318493329640032288641121691435131344216904757585472067739280871274558577888886763702911545008892403142835072"
        "40381413812196205882744933308176781815651571419650184139523868808439873894142990299502773571199254700773965829"
        "40505069596480801954154029286187951921181728705116872415271634077604874063371227144842898712603028462623610688"
        "275714711124501733417572553751110494225479183571648948845731888607993",
        "15."
        "77117067417710899475001715726475937938854018778930174880779806520041411840727177423560108909393434349579552181"
        "24775159314327091955032456419757018077020262156153574505181513172471191158645339927571357818524912983486272707"
        "12291588580073932563653614422839620206266586292520948221873093053975823776289996754936187304352159896156876771"
        "015468496811587576227636095095473566772184717633945339405330371627545",
        "15."
        "90024771473912523730564545141750896666559134578622067255230284033452516013772317609816516725383054165508410919"
        "04004647106492067887712409502512437592582680606952126800172488310155742868489792707287390891008702311142500754"
        "32989803029255029492399141798408644860336753530942734586654467728627658977642688053752033223720047083446705808"
        "444218983029996407752310091763448795485193086044050699179075227514085",
        "16."
        "02149695695219792299228350264189457996262648315481895404378956571293405454119051026322967624272789263067249240"
        "99483397325344391204650675071997583791677016673216177949076073077288748596631680723182240680537039286723943933"
        "76652024298292046951118253912008558176064907492479298408285769067404165601995001682495873893492451380569168665"
        "052480684672167775365328449822100602627386235888117607629689989295358",
        "16."
        "13581378344229144957504110080965392547923472473634354217707903905917024190816224444886551751364631791357532382"
        "35362752080443556237769857325039398299000608644871270043645471431833191695250314864306887618903550675415707260"
        "92642869160866842639424318480923069734468346837396224375681293323049896437786794370196393419740684520457519876"
        "260717581058279975484300455393801884203407282602155622048760192869731",
        "16."
        "24394822497591216210187424233808969892774751417229796350130480272145688512344774252591714600008194835031767055"
        "82179901703159105249559506576476280116460202286695051560942317539264564885831045101778388975237174927289375376"
        "29972877557426292386450904986250829454391823373783104867874948543639133365724217397301073161382317429508046689"
        "262594057712721480553629716238053162259132557499326959178271755311819",
        "16."
        "34653481289131202001773739056597252286163952095679418363180103067731855951734993026481629728637306826754277247"
        "22193722924288456834160422711153120270716018893250601554828924434185820950805445166973693240491793481983483203"
        "50032057951783059238791085449471373733253488008998200818236407442435705194113745206455080467406424910471012832"
        "247972967952311217374959559350158619575075500673005632848486334892081",
        "16."
        "44411514049034012850058964368561559259332543919223143016364902329279381667762907704817339610459259044250555080"
        "39327078066774958943733234438530646684889459733574693423608095558420808763275268690931522655933590326275079626"
        "90981132695345232937664935403696772586286371082469152648334224734697834132478315542287352614722743239776066558"
        "016553826776123247656549922477370984130115175375533899599151832866777",
        "16."
        "53715517111886513653498906358275736425319949689722530541181816263216360655774547176796116043687910496488272347"
        "93259285916045182469624196875483900639925293566932985963786583228002773640779668262340916234596565510970089205"
        "49618056923279473982070326894236928331513682937597704431571923632859325944958271156630648510192786810276479282"
        "782233678225160061893949554276261365074478039201200141096034185340788",
        "16."
        "62605869570108239062140418725177379856176411315115004159610988211246748891914109852116582216529376503911802951"
        "05449816839058601414388674420190675342658917600231491003179688266791545665844570428777678672503573682250939215"
        "85968539417839705388349710086788853906351301543791493808667435475597486845630653110450254081800953162013336880"
        "338884388603160347478448669890791767227275369657780841518987171046251",
        "16."
        "71117792404768743604168108129746975751739573269871996249971183981882406847036859481650980916513077224809917699"
        "06498186964518927350331143998174992726855174729297695308486787644906137328566990100613503351132206587480439017"
        "82349324603111802594973838523650919828685995473213566914734286172266839140529583990377667556754261878256224596"
        "588519392559788652514828861263680954096492024398529162625680677258884",
        "16."
        "79282191265494257458996978541440662785517780311117649277437025933164054212564351064489920886567012063989372357"
        "41919863137086641527765598970343869614032150674760419275713069482096536370165412568143707015986817582971292595"
        "67548154765775910932763810160923332344469835976310776610418278334876476195529920021337399751846302536974621623"
        "453741347064741080510495703994896565552519309503521053051550623483165",
        "16."
        "87126333857727311704993340731521180718489473608279994633758839991564369538883657881958148127989785101509533519"
        "88499429619316015406689177879528322516888966607079438691970978938379647548917966955920660849958541701202098279"
        "18603483811654385230282025426754327077293929504883381435192439219366582495078959939830875435944938000044089717"
        "015334115741229281828493468876793032191535756728196375330663180727281",
        "16."
        "94674399420063180603347640392537185205110964552674017106175952438779997930495648461387053186518713979122719184"
        "07817543839354224878854523695079527215477050275357736548858321278213144595212407987429746344648877938740480162"
        "31828535132695506414037947185201173465247385982934992490469404967587724592554548395276895353595409898385619478"
        "502390678687463962622836411208115179925881515699871702165077675857036",
        "17."
        "01947928223606582872780335658052938879704246471097550791128224310415186259875184543993748130360923776933895387"
        "92917983286639799392107531325595104922881003841778672371909891511352114166729093327324823713269961895430487033"
        "03285313799031214641216166381411885795576234361808712082618702464622338883787915216150436372783047860816587095"
        "332458688921705641277515576461385290501276378977328383137813013202605",
        "17."
        "08966192158342853392088509047389467492151934099468508655262721899262693831987235961374832382615885602783720041"
        "14386684604105384038362379562760657144035754201487369816550272352181776140752518223886227132325854280299695339"
        "06061654341819894513492491624632974192525592636008127939368987600981961744622054023981036109865947530952316809"
        "705151315101400446930619393266624895135955182323721805890693892489067",
        "17."
        "15746502468667016794070219980803844045382668277088122946413671621430521706632516099303968633032818878698706469"
        "23542361985056706501088710091957179200514415468223383993717473495038747118337217606760872180384579606260010879"
        "51737722106836691584985009357268276351001658789309901363541541142239028890280836555429745898638761562947010206"
        "765922958485242984359891337645169887782296197402533921841201821435322",
        "17."
        "22304467010815308840697161268057946225039014545520571142322453555990582939773517175186383190332518667331025193"
        "62456081478613106043827861274293646164420749555207956247931647641107809625669439904300366249451901664808648732"
        "60501647262851147587875798742974124100786387378932173276365815649310057053480347330487890156980245097594505867"
        "694166591312545929965230291418670445516669557156689966248314016354044",
        "17."
        "28654206653353098181992464404155654683939412823530623541626903813827422204980914084709226815083920635470763871"
        "02756340223356506947776818176947985014188124488886881733739470019041901840088929576746064963331610814313279843"
        "31509197841574297574788702287443502123119313877415278877304866456565176360773848651195816021879148876985173267"
        "277031263646152871873014441183590471141901167533828621963866651938359",
        "17."
        "34808538368149917285234021283794691368134950331983389537959936491634699667877411547235655217246772849819242370"
        "82901866963538926338022752721868629358888645644361042002505535838025850964799884448118791116451096568807281531"
        "08808638274341978968354895482288870990505393394330150686285205409461910256828313237800771316014620729111128197"
        "408712519655232673726993167731090657784157432284844410962540306871812",
        "17."
        "40779130981145141399140293477658772727469230416897975812984448619514750147584443003158104549134230486280275671"
        "90128027177592270869449202376467426001837303879359142374100999704971549632156696354772507257600348833608341348"
        "73909027143784365748082991457136260982918509631214089379283854791699127985575276751950639814381413022404340898"
        "037317031344649130788109442934133748721229332612763230675387867060167",
        "17."
        "46576638340285831673157504304387175493255186966006965736628925358767438195218779369287633218609763763408789805"
        "22173677308313375254501431447351639937019842355591021787272894678018114449235113218491123390589628328692051505"
        "13708620081533545907748750224381419445198858131583714181742840318906599828122743306582674187117835956409356596"
        "804579817623463035229848008072471150460106195548408352347746742847561",
        "17."
        "52210813719389771124995572034222356240481707827026427390571519783463731455510423873150497489953435919807988285"
        "44026521021983880841104847606197055043231909577888986756754722991923227561416271623235417134150991720675231057"
        "04142354142286507565791349450889277448545966302507723270185283899864397011417078910276215036241179611950839739"
        "662625626455044878609357243901835302874736030320059872773022839076998",
        "17."
        "57690608543915879539961385386309730386083536770338263421797927510502033699932765600959543635003166256584086522"
        "79766622427817899608722500519984818048976222878870869852380914385060850536319820502471941407385399873792684093"
        "03934286420729479452837709138518786355198810012076646196653084861659638299340083440855659993917810136693887499"
        "673110592919880225890667600561450738971059427382635508450091570097859",
        "17."
        "63024257948271653932383712884662675395619431434373606328369511818797460532199860967658545722172209354096745560"
        "38427128551909153161712677685512041883169761690828789767131610416009210695897088367762592608997003425427619591"
        "07817464710887483018031112156977258240064220687983570300417350906046032596793701224117336432612122346984445322"
        "343505811317200044404325245524587348610225714892960184376194438742903",
        "17."
        "68219355217764293046931107504154063245479431517383385154892495404520190373301997672070942989418366909162206905"
        "58298649634476746383814608502776903199422064920463221449141846382836156810174496864917730999474040773793955632"
        "67125512703092895031616346899622091168324459335139948282486097513426616067084251033517363717148785943762510534"
        "333490466778398817865864252996839848563898275763467374270388303474531",
        "17."
        "73282916804289230259006689701322426052634961744275706489853282728765337315437425008544008124875949553852312211"
        "44631207863580683319522098076843858216256882068998897941849921027019358952986797675550367757359855977153414482"
        "47873700759325978422207409167388561946150223833135803435044691082980471455256218231653367433009869225710546713"
        "847446382266908465706428817510556416763430212167661925983678317689559",
        "17."
        "78221439312777309190739057692832192281860934516246966828824860673744858426578729189911536582435098107178154835"
        "19635237962898124962833936760883713636221462438949469568551773249292673396052289304358446981039072142177200438"
        "08120931206339233299438914243909015437719067832873971853535761149326746352476616918607787268605165583917095714"
        "007024394600276277913067861955743579281638075879563801550521361400101",
        "17."
        "83040949619679733325626373808740775630579320487642654786627466300356643238468024087963299962572570830009112773"
        "92687646552345921012547137859426460784375899397336476768612106084357919148274562917674497640075583906145844866"
        "70558546409061408823289149666666818024559557140308187730981247373784664587280435856629009596287509432264978977"
        "660915985852234235063815941899607957940727152099219426925372856581083",
        "17."
        "87747049093423228885281174325966270335086653264187623532724042438263443802570031195129957032949666948773836692"
        "85141334554224477328667978614122838871786781465199258523455677222305877994832019679130673910206080078259903493"
        "66451164476805546339769760220805534987675878347990806759564468339408725207557557011408435539499579334714364702"
        "076041798486860978860009676392441269681660376828431489832998763783258",
        "17."
        "92344952730626786990342607000461658612278372979362401988690426996587216885461538417478132533296153740246708975"
        "41360432378243452348284970176754620139084984365848826322576342595575432823975604321314259537347743752249012240"
        "27834174376390115551172850840545446370919691863863162138436779349056977625063368614038926314141157758995633570"
        "593909444840439875814859101692914284555504462737973961801589348562421",
        "17."
        "96839523893812309627500344951738282305865336790199441045373172035371257921412829561733386951695366651715326618"
        "44500638336117302237133671778889562576426978636746825577644744912496648696348694674506325188459762251574454369"
        "29203774807794710993549169067538180609230496568688211520386012533845072853251411123534511690847284034061828924"
        "979836346301147669327210040586682352268581578885354613616677879192008",
        "18."
        "01235305230807293875586726487676113838494076653672812321930350287223560822045604976598590581690698054177191219"
        "35783952866365246395670055620966442596874212709936899846464877997608675575803789762637859878580288829165934023"
        "67582926712749625025395229096162602944095765767003293442756802839571379406129666952518296572179431801499117577"
        "022831811590456125422748646995266409456422225586206021840322692382857",
        "18."
        "05536546268666833172716074823100951956574664719373038553090933159785233495257842514527942725088703416665870933"
        "71344912355226789082217939372208099545578089017633891783928314920512820594806291514322467208262695769886632118"
        "52119754955967569929315382922357289706041278636253185833298598511399638105081736687620508948263244525471222947"
        "804257016135464845038301780535378180021273347494295813215232102999649",
        "18."
        "09747228102291809283987616616432943797326372837466638740990036330442309591360818897978636812287268532478574030"
        "35234577540353837353365988707450632004454969694653056384353937429210930808551211665970640871517324107175107768"
        "13994536867846471600876935467557239720329955864393503091522335217308468551898804050931884864074974187930869095"
        "426636541733964836470414482229854405996155347764481217202728996408614",
        "18."
        "13871085537257493102327973009464537868628734935667691942449820404976263583265270308104586326416406570746150360"
        "88124379527269451673892048586796779789076565421266754342224860137642927986989745412623728336513629366008512611"
        "71024940667498778746253799866490414715539561648775214507198558445051277115507846030240001071535504590488750762"
        "226492938922487331198045407471864288427126708589240674067562104543957",
        "18."
        "17911626995511457137748796361201990565208521612661859153183132685163127353583743385165206080630737152200294282"
        "83480862545923232636321311834382940556670108550670615876746442721031222581188766519128904864072502796684471427"
        "12674562099014392095571206458285314302909409592642841502932705416119595372330139185232535836986175505626716905"
        "102551635720868328845059106716603941432470493828723765413424721976223",
        "18."
        "21872152449803255419321568055258013749168303458948843731906030227259220650882755761143137518270455215449753757"
        "54447669044647743274533491097214105105071024262857782330082534336398636953809134639703886730987056199912294711"
        "82831382051550803100625573309055088036785775202381313835883262855970305798706681563291905495590616431781211404"
        "743717763365778127660253455212146746026811363929209719531660648504082",
        "18."
        "25755769616561915104320634671335949819923250838247367135480870103002754055972575277617781066800125225275977232"
        "42641088276677308448582698695759720510850582916863050117739831821127955979984843361548639632008057699173982830"
        "44777859242736533528469641384462646449048498245076151748574369137637698354085249506589175369468761354193835322"
        "10821743200063786350760207420579200676223678007228393958258720083932",
        "18."
        "29565408606300523996193090060357876317632771616202244252865933847889502768461280113471804844557807886451202365"
        "06226895322316408037982790712472132129406261667217032427734120642933969100088913326147279959302358398985026809"
        "07757808722725076622433926254807390507349193089487065273859422711581690536923283818694448490391002663699373577"
        "479984089586448960986922914070154319198856799480586814831572660049059",
        "18."
        "33303835204572936607036005386024741688199353990632593641700101963983681023552174485187243819453469873779381811"
        "31825666612845512653759264002520961989174631660817893463865792784360212205442691081580363607162650686819203332"
        "71695665204550361645092770414267870574761534021576748772414710332296686656677922105572480136623006540318287771"
        "752403257225484193416375374630295739694584359181669584822144217946089",
        "18."
        "36973662934278883354515482996561219797203018465420452158383672361243138828412847012036152007915208160473121455"
        "00255045838107490932256624627082978133929056794442682631531786730455915350995902437718602994931962013373284631"
        "66245762316637806913270164277457975112426005180292583426915918675383435395598215385153247994877265654873384456"
        "838948090969392401887506081626510459117637684719849016393221041720966",
        "18."
        "40577364031090014613308008826194620297669031746629434467281163702488915761152151884873830206368214795370944470"
        "49123227244987480054025091524945140578033220604911360487416669888171144275551112109639232093560238920970032449"
        "60804568051496345885676927757469123572277620624446804627512970828422692616021227425852662243212443997074981005"
        "547833762050079432581680067106949297497692327125068990077901522226957",
        "18."
        "44117279447439969818203007472174003164560255253442054460412082116746783833744989299277174735727601155314209111"
        "08752683718837023506726216043917816309527925179513942855858514960867397217641805884227894630439493534540119418"
        "63375479066641639870318143091000764755109263681792932398864353035859720611512874738125344871434992639512151401"
        "272538083058455878170262156351968871089395179837425273523581266914745",
        "18."
        "47595627986464597709414934346663732189241252367556916529377819718435871713823800089497791390570676646849082185"
        "15596922689355404812963950967905144713572265818769540470623592515714642510428305982794452432493267282466155284"
        "39909669035081213620676293902237813652072669980037204993194585367283586203388535553867278372901794543395191418"
        "41532839938596761951045619471589862830891354308681626977577420483375",
        "18."
        "51014514655144262741490580673591356700371265081229507744333083670833049807761758000788763000280699852748995835"
        "79288113233581642846707809120452869723772747345531678111439035327731338054705858873379868977796232313939801546"
        "89146471547983633489101760043708991315746940120025902341173853793429617026275691215584867628750464940410772709"
        "161351434979639911956946479201132978330304672548030931942250342827294",
        "18."
        "54375938315397840777373858913955248239941847920328667581513228848814216209238117867823746808674105485439472281"
        "08022904748428827719132333747691490873157820303656109335299073977186044216598475398260002172920673709728411404"
        "81951268123371806904127561582119629238406458303614251588164480023737085705426073286402804118115057351782908273"
        "33249222248570577590327817428193141575383830773736064963674654660788",
        "18."
        "57681798702764718693785125833664093766881884059578632121411570099058099393730172845698256959695518250935264027"
        "70924935498534244119666778180122480026547152391008745900377383074697130483255708745202325708674642247886396564"
        "53937494219294174471955373301736672685268384577575584576576899158917424074434177408506824723823546414342198182"
        "263466224674661649356568188397290822447447185825387180657594093708751",
        "18."
        "60933902874383544352004696147770928693931085303439982643386614611764183888253280545279263672128307636934834701"
        "76172904964885176580405080810022923626994609631887966369193595637705888125904117855971127197217572656552017216"
        "01867128800954165396591923271771796713301912904158675092529178443570927414653982088273331584295588174225100793"
        "199329706639345162173054259175639620324704962515101988919574683797276",
        "18."
        "64133971141063842472249904701344996788708966387103228460067832643561858702336088950243566599710247680999306206"
        "72898994294926400572559871735580095972897020078688799866814000238328565334739235487070966702278327373392879085"
        "58274044368146372966754230837592655179154123960009424338853507410779228164259856997555111697864450713171508666"
        "161000757176178710802248263025585993364498172063037657704404452535503",
        "18."
        "67283642532205036848611316396789453615254214503278747277913757997719027791412850817797370234474921542286648925"
        "59320152843540440549281234752068800370628193891125047141060956397322884378541898460173240557131422777684384341"
        "38800721340366655917386856186887417022606078557020556496094324427190459240576788558291551699271849591355480496"
        "655647717244614207638067307680084952591605729876523430439516165337322",
        "18."
        "70384479837025331155674812889019630924089038399820189398731400363050206767528407267731579093143415973931605804"
        "70676344339881161657537050894790104024825013301648668089330955329652333518347194358366987353798818539255222889"
        "87702030512098787246242665060494288818182785084700362957305908534097737840396555283267034806128689898134337131"
        "513408714563437722088348519474128730338455257510535561818243515295123",
        "18."
        "73437974260917294869584651144958163456568354412510651195707535511309175758483504055032343352398310308739535325"
        "75348728117375368657772091107581078083317023639996633588692966937652327010874878726062876512156781179827693332"
        "63424530048349886338191672000649776344735688777038908317935895545479771750928675097454702913124841960320021274"
        "672197296187088995346243239131294305233657221950357770047779041168948",
        "18."
        "76445549731660365969796467668224444194756658105501825097485098208897468645988181204906709375392815886364228031"
        "70222464794911320483549324111657339191569703012332779137349909318248601006678827489280840341478226135220251425"
        "22120240087012670818451468498896073922908905983528384054249374818979283244638542138214163225714979901542761366"
        "770616662189716515808719831023436094002277345660650710470976214503432",
        "18."
        "79408566886618274020482378130737374978523332786292197009126153652209967842012810112283126118880090224730105249"
        "71205905538311488563849933347027957792666894624272283859437741921816718431321380226593997153508259050606694453"
        "19905454600530058604054055511420322690455781203696250448217551628254838303648547201462249630753150471851402187"
        "751539728462449395082445265630322991793425964521071134426892761087686",
        "18."
        "82328326768867946516209716586995768024335839807194833176766112965627616145648993732694510000805245875257813926"
        "01249500941408229306792369561865440018845485744805693055107503702342520061118936831729324129005219749413387026"
        "33001498513242371397576436139136862285451437091371996334236706363050324566964591659888586507940453615852818616"
        "01603030153235699981659298052458840307661288883784791255308752353561",
        "18."
        "85206074257391290087106464528886464815967521643530562927879755318422136799384016660757347006926705351373562404"
        "00878193264155063868544379464037208122282848659001534073037556949446529094408909180005053449633948538095794661"
        "02995490946923404655914747241389209313457700354163158136320973199396402856713949800424774426208733366034958384"
        "913000571799639761622099679737940788622933241370717844146251711932128",
        "18."
        "88043001253965570106571974001264265051468906188884729247244631726057648436047910837431842225674821292842192978"
        "61760000155527300662133094050934125024242312350417037785722299686218120942249537837517270482348878782215297964"
        "34400738059144871066371011576734445290684672478932371976691435646196856591582073749970279840730554499319160664"
        "075936135140351358832332481792115613668240634181554442075595951874232",
        "18."
        "90840249647171723231146778116573323317114094189676045555303433090897170929661968680415949833496400664911906948"
        "86464869486758669657816976172934439932928949602739929486818166007486075811320586454697098950048158130324818991"
        "64996133398853203604094641445335770040577643758444125343960451089873183667195183097301272165939070294009329717"
        "796749663916249651314647264543061678516229808974080105230884519025421",
        "18."
        "93598914071968152435518382718427188311701871361642404437516171882406597953143890815209135951678923630442195775"
        "28935309683128960894788078206526807239187954420566902347859003417615150979380482457853673918109838368047720374"
        "80360220145546699221066508593371664219887047644628393373836620900288539062774663891696384999640649150431067240"
        "627749142322666676970274474792135970231868616050929898319819448939034",
        "18."
        "96320044481520416740488879846966522743178835889229984743855143597110581356632935333985107675053026290118443031"
        "88259078029845590868280998388008230759026082362759439276713870496302287571667186322253591141813783747691862164"
        "86342164672374303171089906235756037703334480067642792992542669516647312965086899057259968955796081732571906843"
        "773036664256360263051447703790357359429377002031207739864979999279347",
        "18."
        "99004648546408803335332523857009487152359274640740245486444765943841865089735218800382760365958590525729678826"
        "18729806630153515910302867987535450753128718867085403736907329572304793072138460831341854087824778230436034159"
        "14158563765104431367119681516469558190435321626296408405773925785846797696565762444462069369032104851518168840"
        "362055319574446706630124442642806832354006488607879109906061011225994",
        "19."
        "01653693894933559092190887897207108160857880330850227114616313293500120610242341811783586355115768229101103631"
        "35490715380794741027910953792507352046416518696262554079712029523207077884237260577068225431178406763084283402"
        "34652209177652929619836857962138281947043694787969753375808877555756525156889419987622193160096718082756877689"
        "454214937644538436622120458515758071395625444960838247998451767464267",
        "19."
        "04268110206982004032321105777771410915055807622857598544868849720872792841212224288843193249828406718096610896"
        "00909281284165383265861632916723535317660271115671233060157246141430202051367064985070553468138179862096425054"
        "18179828757157587146552894936306186818734849750397304488535715134906592464324381660408650130874094490704788761"
        "416060096501351661608424222204094369103147551037672603814369634649173",
        "19."
        "06848791172795817569703038290654967132328469247797598079289228040499590975793318299682223245258479126943300417"
        "23761386766798052140299374053070843004143139593137898316009851782556381115592705199063266227156177179641684120"
        "02699242926437873012736620082535900009120622005729068876661407020205549742970102634687260159098231611555026386"
        "636952356914915597529253373429394903680674472796958663494038067669179",
        "19."
        "09396596326965615990180153285765268673131309511478727928235014318406061524888095295889234527610174179295920303"
        "99452792732558214136830570717188734790559143189556235805596272854834495907411192712404986981776645891489617911"
        "64562328382134513604070535948997556425774535241433839196056647337630745324677877037589790564832932809741759428"
        "622931327986353687891898499439791429917840804474313864245639140963876",
        "19."
        "11912352767070533179325864702617447306181387891478107064160507342452748562668356635587819119814370983850938904"
        "49507241565905932629944114232655140558705553309571664715176711176899431189294412547073965323850484661118538013"
        "52620946858612646592880180562600210076019427990165200479741063391057955342589569972650353707736819649707138135"
        "073772494722116787681314798945037658461538374603477221825614061123586",
        "19."
        "14396856765561496981292270787290522850449989557440119591929068466463229254331915192967068636556898258832614374"
        "83586064428007554095607086612131395142486090096137700517715016247628524588931052599204773274387882433713027222"
        "13272226600736522283567127277667156871770413468147870394343816746792945999572244176333552811712447483231232773"
        "171106511438260175071145300046115843401710072061507331123043607901766",
        "19."
        "16850875282748278060915413692308274574677141421242703468110926230200064596808708521552063800949653739375217875"
        "48734759838376873770256950105564836919793092179534192559850017271846196601584351918237027706741755817976315787"
        "86818852604111682506864006199186805540809913091091561814668081471402749434233431033452441548505582706019452955"
        "567976154397574205270457372773342241946969622998755580434262211071558",
        "19."
        "19275147388083404256371356222515343352157794018697377680386663953664110427372185158286933011634685124122403962"
        "31285411228213718107569256810026412124197799238113843202794664542212322176290417928824311164992149773031063061"
        "57966687858071257893713340199820635963233697984370035461108601863346164084264967404520613456100656965925875472"
        "210769471793070984755357524002396981276686789870757739219539841324669",
        "19."
        "21670385596332959399208334887734151035687285541915452428606022419819216495034404219492457076304135294315977649"
        "65340866556210906626487659290734805639266045132722334912623539146470919559029242977028610312482715495587186097"
        "63974479507490837350364617085882753391176792131259310397149374028556893735115741447201974608383790314541221313"
        "482249282941830681505989160209022143487123591182161037084387107577471",
        "19."
        "24037277124678313633628862297411701857358144377444476799714721076802310238781984672249186524482029569805558447"
        "81516674856703009857958140362876120862383944893106859178223089820624858975874246830400756244044697193682143742"
        "55580054164790522993745386564072906888203344350441788631572056395846260169628655731587443716443908470481602481"
        "327796867951175756539602824534024677208143458306390998693538144276002",
        "19."
        "26376485076297950919631770576168610809292289235689221025479946999975147517952964675051217746971830342609453808"
        "27178426949939123660185324293859961951001653286753303273211019423998905232389505830839195770894670435775811590"
        "99371618262297126999910295820866611740582812686480215151994304295620401944519281853807987442610790122820927006"
        "439539980791908595120476521299636624843377591628005484740938263373595",
        "19."
        "28688649555529452245085152592748925564633384865104371788279071879676994376320354777241374439508372060067000926"
        "62571713426928981451980646607583798405022142283748751686904017252721688141303879642279401713553451074597074136"
        "34435078254467165459318134413588306046635342334572072865760417877208230914828250259039270224031775041480686581"
        "149991980042698893384296012208438178584526032640636530664689171174514",
        "19."
        "30974388719303651356990900375493268839019518949440912608195769470745329576972546325252737392299555084870761689"
        "27177347163467269260033769499887449403299529384357224002613067896585187364874354555923232888663635644600569998"
        "76237001095092480820045715217327131479089102764865100373961878408215166685028270522348153253852064527393390794"
        "401890890932406298166622224431486187051653736399833197687524233000392",
        "19."
        "33234299769171826936564785105182924430057214423779998569023614879429685964733484058177274419007714616763620517"
        "14225290477824014114818724806990080412735741447053909096284555542058828565377011030445358440020473282628772307"
        "06418721410147702147287802942241134713881576962004492246225067150128745210304021219616585555420191917418786300"
        "056829952680702638022710700076784220324428140020802898115083347702904",
        "19."
        "35468959887908821188327891731501519122244386756536820941186160834789318450080915307112345688333934898867526502"
        "81782281031747909237416383645542937091032132394951238658987421415840769416609656924534264807708657744363803037"
        "03020587851939728834028918714275983773159730132531253761589283704592841895713231304417993106469276962707965968"
        "679020792759185611101812841427933459395519877074670185732532077876915",
        "19."
        "37678927124366879874320971983095171066072401382675998756346770821436833756330706981044967614252561200349920108"
        "61126455011590940783783186480144005503458707570235443817730948266202724532385292865554190974298617552196735544"
        "76395943490245768513403194721941361801918811127988057063915654267554707302094460700078255016831241731287084620"
        "030531370389406858605301314913503432729894455360413554796057743624785",
        "19."
        "39864741229973853673310198302034476041654300093345258693835721639167971456887206348020658762784960772589204986"
        "01004244095122183279039765571921299200726024490539636313707208933612943114308778647980576361063903833866083434"
        "78253049758287190639090148001663846660919016228401517981946486814580501445191763231914170223651871543954569563"
        "229752867364010807484149328122287932691728836607206296504503654291916",
        "19."
        "42026924450012563944302688641235851149917334710174017378924534854564977779999293345571712878297942599923209603"
        "56980121652749224886169039988183265356878113646454633398859516766658822031550187927925054737966008433143365763"
        "46118972683035247786115152970665197263535031125663311669153219106967873840911780618890220192918885584791820817"
        "380351857621444438732170662912318105800373867459654881916254806601924",
        "19."
        "44165982272583276485388682706286093800336057528707385158680801947377734819759083481562355181502926758655463935"
        "88253750633609842101030690037296126839149163942176742898124654398135413169388709993548614021603755828103424550"
        "43995730819816948505547453029096197833928688735935982538915244747599958654970407704104602569366784225221531104"
        "839626781845870092648147888203880688567605208831444945817857785153427",
        "19."
        "46282404137936251420245373832914505987179516794577812862089657620929257117786502308313448749254293107851793946"
        "48906304205236655507999396515486189069557805158115415330576719435049918626695141423287389580492978580932706855"
        "82461594213632344682911288013670395835728596839923778216755784200501989248577166652556656745561631320914185098"
        "036550279972269808563352717494278133064808018424486494613581670904697",
        "19."
        "48376664110664371848117839511434047591975268199435564361018144186083213158191460466530496811295831474691124349"
        "15353769571835449873868086350803411261181263642864704480019645904033329615183170078642939407327677633159355396"
        "59300785943459751426720740528037173390794501709108627539732588206226415399674048608843262175783293190807110169"
        "521287571898125826758063922707869247389042070537305271065057452360137",
        "19."
        "50449221517065218515342561155161456809779283703161751598825574835397146377621361365197298084573900965341160207"
        "47638235834863352768862223657410993560879758154793215359793976519597149563581419343991103518478263989266246663"
        "13434326948757230737160647513320407575743953348133831681915668076630219831345596329489041495050445409516995558"
        "844346940248424949708046529076568535423815692145534030368195098701895",
        "19."
        "52500521549816144973266072401605164852396136071234571245810367391072812166019661923143396972741343266046339927"
        "36241341225112609919380196568182736069908344821886027354952690366123447535755415001777884824418589329952519126"
        "38991915887976340582351644944484386746538099514350225025606794291055273254188295438637568256704763646291409512"
        "47734867887985343458291386040322597855003211338820555010939867273248",
        "19."
        "54530995841953563008912308832945512577737373176732330191189178760548845692155880568120730427261622250116761583"
        "73573663969046830965280600726842105231896731084670184171351868006786284449877512061474510545259638395626343408"
        "20804697604369657105969423354842149829173951943549166420900709500398322624130365195674097282456714104812933002"
        "700523506427441210494461469512180706693823193924457440917371176532034",
        "19."
        "56541063012007553242048906855532152495436238190800733830298347326852847315134132176880473119221084005645522838"
        "86367311222032006108690210218711331548656204322574157833021753458438989779497428495693721690049046676217384057"
        "49986270376895267386643049526766451459390277406632576412790748533372863644721976845168460840162066672290292749"
        "672668879524315410824251032084115058493720402881895485689493165441193",
    }};

    T pi = static_cast<T>(
        "3."
        "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651"
        "32823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461"
        "28475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920"
        "962829254091715364367892590360011330530548820466521384146951941511609");
    T tenth = 1;
    tenth /= 10;
    T logten = log(T(10));

    unsigned max_err = 0;
    for (unsigned k = 0; k < data.size(); k++) {
        T val = nil::crypto3::multiprecision::log(tenth + pi * (100 * k) * (100 * k));
        T e = relative_error(val, T(data[k]));
        unsigned err = e.template convert_to<unsigned>();
        if (err > max_err)
            max_err = err;

        val = nil::crypto3::multiprecision::log(1 / (tenth + pi * (100 * k) * (100 * k)));
        e = relative_error(val, T(-T(data[k])));
        err = e.template convert_to<unsigned>();
        if (err > max_err) {
            max_err = err;
        }

        val = nil::crypto3::multiprecision::log10(tenth + pi * (100 * k) * (100 * k));
        e = relative_error(val, T(T(data[k]) / logten));
        err = e.template convert_to<unsigned>();
        if (err > max_err)
            max_err = err;

        val = nil::crypto3::multiprecision::log10(1 / (tenth + pi * (100 * k) * (100 * k)));
        e = relative_error(val, T(-T(data[k]) / logten));
        err = e.template convert_to<unsigned>();
        if (err > max_err)
            max_err = err;
    }
    std::cout << "Max error was: " << max_err << std::endl;
#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)
    BOOST_TEST(max_err < 20);
#else
    BOOST_TEST(max_err < 10);
#endif
    BOOST_TEST(log(T(1)) == 0);
    //
    // Some tricky special cases:
    //
    BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::max)())));
    BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::min)())));
    BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::max)())));
    BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::min)())));
}

int main() {
#ifdef TEST_BACKEND
    test<
        nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::concepts::number_backend_float_architype>>();
#endif
#ifdef TEST_MPF_50
    test<nil::crypto3::multiprecision::mpf_float_50>();
    test<nil::crypto3::multiprecision::mpf_float_100>();
#endif
#ifdef TEST_MPFR_50
    test<nil::crypto3::multiprecision::mpfr_float_50>();
    test<nil::crypto3::multiprecision::mpfr_float_100>();
#endif
#ifdef TEST_MPFI_50
    test<nil::crypto3::multiprecision::mpfi_float_50>();
    test<nil::crypto3::multiprecision::mpfi_float_100>();
#endif
#ifdef TEST_CPP_DEC_FLOAT
    test<nil::crypto3::multiprecision::cpp_dec_float_50>();
    test<nil::crypto3::multiprecision::cpp_dec_float_100>();
#ifndef SLOW_COMPLER
    // Some "peculiar" digit counts which stress our code:
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<65>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<64>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<63>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<62>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<61, long long>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<60, long long>>>();
    test<nil::crypto3::multiprecision::number<
        nil::crypto3::multiprecision::cpp_dec_float<59, long long, std::allocator<char>>>>();
    test<nil::crypto3::multiprecision::number<
        nil::crypto3::multiprecision::cpp_dec_float<58, long long, std::allocator<char>>>>();
    // Check low multiprecision digit counts.
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<9>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<18>>>();
#endif
#endif
#ifdef TEST_FLOAT128
    test<nil::crypto3::multiprecision::float128>();
#endif
#ifdef TEST_CPP_BIN_FLOAT
    test<nil::crypto3::multiprecision::cpp_bin_float_50>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_bin_float<
        35, nil::crypto3::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type>>>();
#endif
    return boost::report_errors();
}
